﻿using System;
using System.Collections.Generic;

using System.Text;


using IView;
using Engine;
using DataTransferObject;
using DataService.LocalFile;
using DDay.iCal;
using DDay.iCal.Components;
using System.Windows.Forms;

namespace Presenter
{
    /*
     * Class cực kỳ quan trọng, chịu trách nhiệm chính cho các chức năng ở MainForm
     * 1. Nhận yêu cầu từ MainForm
     * 2. Xử lý và hiển thị kết quả trả về cho MainForm (thể hiện MVP-Passive)
     * Lần refactor lên phiên bản 1.5 đã giảm nhẹ đáng kể công việc cho presenter MainForm,
     * từ nay nó sẽ tập trung cho vai trò làm cò và hiển thị kết quả lên MainForm
     */
    /// <summary>
    /// Làm cò cho MainForm
    /// </summary>
    public class PresenterMainForm : Presenter
    {
        #region Internal class
        public class ExternalConstraints
        {
            public static string NO_CONSTRAINT = string.Empty;
            public static string FINISH_ON = "Finish on";
            public static string FINISH_ON_OR_BEFORE = "Finish on or before";
            public static string START_ON = "Start on";
            public static string START_ON_OR_AFTER = "Start on or after";
        }
        #endregion

        #region Attributes

        private IMainForm _mainFormView;

        private JskeEngine jskeEngine;

        #endregion

        #region Constructors

        /// <summary>
        /// Initializes a new instance of the <see cref="PresenterMainForm"/> class.
        /// </summary>
        /// <param name="_MainFormView">The _ main form view.</param>
        public PresenterMainForm(IMainForm _MainFormView, int dataServiceMode)
        {
            PresenterMainForm.changeDataServiceMode(dataServiceMode);
            this._mainFormView = _MainFormView;

            // lấy instance của JskeEngine được hiện thực bằng singleton Pattern
            jskeEngine = JskeEngine.getInstance(dataServiceMode);
            
            /*
             * path de luu tasklist va calendar 
             * đáng lý ra phải được lấy từ system config. 
             * Khi nào Khánh hoàn thành task của mình thì sẽ lấy thông tin lưu trữ từ system config. 
             * Bây giờ cứ lưu tạm file XML đã
             */
            
            jskeEngine.PathForSystemConfigFile = _MainFormView.GetPathToSaveConfig();
            //jskeEngine.PathForTaskListFile = _MainFormView.GetPathToSaveTaskList();

            jskeEngine.LoadSystemConfigFromFileToEngine();
            jskeEngine.LoadTaskListFromFileToEngine(); 
        }

        #endregion

        #region Essential Methods


        /// <summary>
        /// Schedules the calendar.
        /// </summary>
        /// <returns></returns>
        public List<Event> ScheduleCalendar(ProgressBar progressBar1)
        {
            return jskeEngine.ScheduleCalendar(progressBar1);
        }

        // Dùng cho MainForm gọi để chuyển 1 task ở mainForm vào tasklist, chờ xử lý
        // Khi nhan dc 1 task sẽ đưa vào tasklist, đồng thời lưu lại dưới dạng file XML
        /// <summary>
        /// Adds the task to list.
        /// </summary>
        /// <param name="task">The task.</param>
        /// <returns></returns>
        public Task AddTaskToList(Task task)
        {
            return jskeEngine.AddTaskToTaskList(task);
        }
        public List<Task> getTaskList()
        {
            return jskeEngine.getTaskList();
        }

        public List<Task> GetAllTasks()
        {
            return jskeEngine.getTaskList();
        }

        public Boolean RemoveTaskAt(int positionInDataGridView)
        {
            return jskeEngine.removeTaskAt(positionInDataGridView);
        }

        public Boolean deleteTask(Task t)
        {
            return jskeEngine.deleteTask(t);
        }

        public void deleteTaskList(List<Task> lt)
        {
            jskeEngine.deleteListTask(lt);
        }

        public void addNewTask2File(Task t)
        {
            jskeEngine.AddTaskToTaskList(t);
        }

        public void updateTask2File(Task t)
        {
            jskeEngine.updateTaskList(t);
        }

        public SystemConfiguration getSystemconfig()
        {
            jskeEngine.LoadSystemConfigFromFileToEngine();
            return jskeEngine.SystemConfiguration;
        }

        //public JCalendarEvent getJCalendarEvent(String path)
        //{
        //    return jskeEngine.GetJCalendarEvent(path);
        //}

        //public Boolean saveJCalendarEvent(JCalendarEvent jCalEvent, String path)
        //{
        //    return jskeEngine.SaveJCalendarEvent(jCalEvent, path);
        //}

        public void SendFreeTimeListToEngine(FreeTimeList ftl)
        {
            jskeEngine.FreeTimeListForSchedule = ftl;
        }

        public void UpdateOutlookAppointmentCalendar()
        {
            SystemConfiguration systemConfig = jskeEngine.SystemConfiguration;
            _mainFormView.SetOutlookAppointmentCalendar(systemConfig.TabCalendarData.MyAppointmenFolderPath);
        }

        public DateTime GetStartScheduleDate()
        {
            return jskeEngine.SystemConfiguration.TabTaskData.StartScheduleDate;
        }
        #endregion
    }
}
